package com.mygdx.game;

import com.badlogic.gdx.Application;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.*;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.StretchViewport;

public class MyGdxGame extends ApplicationAdapter {
	//纹理画布
	SpriteBatch batch;
	//纹理
	Texture img;

	private boolean isFirstRender = true;
	private Texture tCir;
	private TextureRegion textureRegion;
	private Sprite sprite;
	private MyActor myActor;
	private Stage stage;

	@Override
	public void create () {
		Gdx.app.setLogLevel(Application.LOG_ERROR);
		Gdx.app.error("tag","create ()");
		//创建纹理画布
		batch = new SpriteBatch();
		//使用badlogic.jpg图片创建纹理
		img = new Texture("badlogic.jpg");
//		img = new Texture(Gdx.files.internal("badlogic.jpg"));
		FileHandle fileHandle = Gdx.files.internal("badlogic.jpg");
		Gdx.app.error("tag","badlogic.jpg 存在吗？"+fileHandle.exists());

		Pixmap pixmap = new Pixmap(Gdx.files.internal("badlogic.jpg"));
		pixmap.setColor(1,0,0,1);
		Gdx.app.error("tag","图片宽高："+pixmap.getWidth()+"---"+pixmap.getHeight());
		pixmap.fillCircle(pixmap.getWidth()/2,pixmap.getHeight()/2,64); //在(128.128)坐标绘制一个圆 fillCircle实心 ，drawCircle空心

		pixmap.setColor(Color.GREEN);
		pixmap.drawLine(0,0,pixmap.getWidth()/2,pixmap.getHeight()/2);

		pixmap.setColor(Color.BLUE);
		pixmap.drawRectangle(128,128,64,64);

		tCir = new Texture(pixmap);
		pixmap.dispose(); //释放pixmap

		// 创建纹理区域, region 表示在 texture 中 坐标 (0, 0) 为起点, 宽高均为 128 的矩形区域（即为图片 1/4 的左上角部分）
		textureRegion = new TextureRegion(tCir,0,0,100,100);

		Texture texture = new Texture(fileHandle);
		sprite = new Sprite(texture); //使用纹理创建精灵
		//设置精灵的位置
		sprite.setPosition(0,0);
		//设置旋转缩放起点为图片左下角
		sprite.setOrigin(0,0);
		sprite.setScale(1f,1f);
		sprite.flip(true,false);  //设置水平方向取镜像(即Y轴对称图像)

		myActor = new MyActor(new TextureRegion(texture)); //创建一个演员
		myActor.setPosition(320-myActor.getWidth(),0);
		myActor.setOrigin(0,0); //设置缩放。旋转。。的终点
	    myActor.setScale(0.5f,0.5f);
	    myActor.setRotation(10); //顺时针旋转5度

		// 创建一个伸展视口, 为了方便查看效果, 世界的宽高设置为 256 * 512 （图片刚好在视口下半部分）
		StretchViewport stretchViewport = new StretchViewport(256, 512);  //图片高度是世界视角的一半。通过增加伸展视角达到不管屏幕尺寸是什么，能是占一半比例
		// 也可以使用下面方法创建伸展视口
		// Viewport stretchViewport = new ScalingViewport(Scaling.stretch, 256, 512);

		stage = new Stage(stretchViewport);//使用指定的视口创建舞台, 舞台的宽高为视口世界的宽高

		Group group = new Group();//创建演员组
		MyActor myActor2 = new MyActor(new TextureRegion(texture));
		myActor2.setOrigin(320-myActor2.getWidth(),480-myActor2.getHeight());
		myActor2.setPosition(320-myActor2.getWidth(),480-myActor2.getHeight());
		myActor2.setScale(0.5f,0.5f);

		group.addActor(myActor);
		group.addActor(myActor2);

		stage.addActor(group);  //将演员组加入到舞台

		/* 事件初始化 */
		// 首先必须注册输入处理器（stage）, 将输入的处理设置给 舞台（Stage 实现了 InputProcessor 接口）
		// 这样舞台才能接收到输入事件, 分发给相应的演员 或 自己处理。
		/*Gdx.input.setInputProcessor(stage);
		// 给舞台添加输入监听器（包括触屏, 鼠标点击, 键盘按键 的输入）
		stage.addListener(new MyInputListener());

		myActor.addListener(new ClickListener(){
			@Override
			public void clicked(InputEvent event, float x, float y) {
				Actor actor = event.getListenerActor(); //响应这个事件的演员
				Gdx.app.error("tag","被点击：x = "+x+" y="+y+" Actor ="+actor.getClass().getSimpleName());
			}
		});*/
	}

	@Override
	public void render () {
		//设置清屏颜色
		Gdx.gl.glClearColor(1, 1, 1, 1);   //对应R G B A
		//清屏
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		batch.begin();    //开始绘制


//		batch.draw(tCir,0,0);
		int allHeight = Gdx.graphics.getHeight();
		int regionHeight = textureRegion.getRegionHeight();
		if (isFirstRender)
		{
			Gdx.app.error("tag","allHeight = "+allHeight+" regionHeight = "+regionHeight);
			isFirstRender = false;
		}

		batch.draw(textureRegion,0,allHeight-regionHeight);  //把纹理区域绘制在左上角

		sprite.draw(batch);
//		myActor.draw(batch,1.0f);   //绘制演员
		batch.end();   //结束绘制

		    /*
         * 舞台自己维护了纹理画布（SpriteBatch）, 并且在绘制前后自动分别调用了 begin() 和 end() 方法,
         * 所以渲染舞台时, 只需要调用舞台的 act() 和 draw() 方法即可
         */
		// 更新舞台逻辑，并批处理舞台中的演员（自动逐个调用演员的 act() 方法更新演员逻辑）
		stage.act();

		// 绘制舞台，并批处理舞台中的演员（自动逐个调用演员的 draw() 方法绘制演员）
		stage.draw();

		//  // 判读当前是否有有触摸屏幕, 手指/鼠标按下后, 直到抬起前, Gdx.input.isTouched() 将始终返回 true
		if (Gdx.input.isTouched())
		{
			Gdx.app.error("tag","isTouched  x = "+Gdx.input.getX()+" y = "+Gdx.input.getY());
		}
		  /*
         * 判断刚刚是否有一个新的触屏按下事件,
         * 如果有, Gdx.input.justTouched() 则会在当前渲染帧范围内返回  true。
         * 如果手指/鼠标一直按在屏幕上没有抬起过, 下一帧开始即使手指/鼠标依然是按着屏幕的,
         * 但由于本次触摸事件已在上一帧中判断过, 已不能算是新事件, Gdx.input.justTouched() 将返回 false。
         */
		if (Gdx.input.justTouched()) {
			Gdx.app.error("tag", "justTouched: " + Gdx.input.getX() +" - "+ Gdx.input.getY());

			if (Gdx.input.getX() < Gdx.graphics.getWidth() / 2) {
				Gdx.app.error("tag", "左半屏被按下, 主角跳跃一次~~");
			} else {
				Gdx.app.error("tag", "右半屏被按下, 发射一颗子弹**");
			}
		}
		 /*
         * 判断刚刚是否有指定的键盘按键按下, isKeyJustPressed() 方法的返回值规则和 justTouched() 方法一样,
         */
		if (Gdx.input.isKeyJustPressed(Input.Keys.B)) {
			Gdx.app.error("tag", "isKeyJustPressed: B键被按下");
		}


	}
	
	@Override
	public void dispose () {
		Gdx.app.error("tag","dispose ()");
		batch.dispose();
		tCir.dispose();
//		img.dispose();
	}

	class MyInputListener extends InputListener{

		// 手指/鼠标 按下时调用
		@Override
		public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
			Gdx.app.error("tag","touchDown: x : "+x+" y : "+y+" 第几个手指:"+pointer);
			return true;
		}
		//手指/鼠标 抬起时调用
		@Override
		public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
			super.touchUp(event, x, y, pointer, button);
			Gdx.app.error("tag", "touchUp: " + x + ", " + y + "; pointer: " + pointer);
		}

		@Override
		public void touchDragged(InputEvent event, float x, float y, int pointer) {
			Gdx.app.error("tag", "touchDragged: " + x + ", " + y + "; pointer: " + pointer);
		}
		/**
		 * 当有键盘按键被按下时调用, 参数 keycode 是被按下的按键的键值,
		 * 所有键盘按键的键值常量定义在 com.badlogic.gdx.Input.Keys 类中
		 */
		@Override
		public boolean keyDown(InputEvent event, int keycode) {
			switch (keycode) {
				case Input.Keys.UP: {
					Gdx.app.error("tag", "被按下的按键: 方向上键");
					break;
				}
				case Input.Keys.DOWN: {
					Gdx.app.error("tag", "被按下的按键: 方向下键 ");
					break;
				}
				case Input.Keys.A: {
					Gdx.app.error("tag", "被按下的按键: A键");
					break;
				}
				case Input.Keys.ENTER: {
					Gdx.app.error("tag", "被按下的按键: 回车键");
					break;
				}
				default: {
					Gdx.app.error("tag", "其他按键, KeyCode: " + keycode);
					break;
				}
			}
			return false;
		}
	}
}
